#include <iostream>
#include <string>
using namespace std;

/*
	在子类中重写了 基类中的重载方法（只重写了其中一个版本） -- 基类中的其他版本将会被隐藏
*/
class Base {
public:
	int f() const 
	{ 
		cout << "Base::f()\n"; 
		return 1; 
	}
	
	int f(string) const { return 1; }
	
	void g() {}
};

// 未重写 基类中的重载方法 -- 子类将全部继承基类中的方法
class Derived1 : public Base 
{
public:
	void g() const {}
};

//子类重写 基类中某一版本的重载方法 -- f(string)将被隐藏
class Derived2 : public Base 
{
public:
	// Redefinition:
	int f() const 
	{ 
		cout << "Derived2::f()\n"; 
		return 2;
	}
};

//子类创造了 基类重载方法的全新版本 -- int f()，int f(string) 将被隐藏
class Derived3 : public Base {
public:
	// Change return type:
	void f() const 
	{ 
		cout << "Derived3::f()\n"; 
	}
};

//子类创造了 基类重载方法的全新版本 -- int f()，int f(string) 将被隐藏
class Derived4 : public Base {
public:
	// Change argument list:
	int f(int) const 
	{ 
		cout << "Derived4::f()\n"; 
		return 4; 
	}
};

int main(int argc, char *argv[]) {
	string s("hello");
	Derived1 d1;
	int x = d1.f();
	d1.f(s);
	
	Derived2 d2;
	x = d2.f();
	//! d2.f(s); // string version hidden
	
	Derived3 d3;
	//! x = d3.f(); // return int version hidden
	
	Derived4 d4;
	//! x = d4.f(); // f() version hidden
	x = d4.f(1);
}